package com.geaosu.wanandroid.kotlin.learn

//集合的函数式API ---> 正式入门Lambda编程

fun main() {
    // 需求: 找到一些名词中名称最长和最短的那个名词

//    // 一般实现
//    val list = listOf("孙悟空", "唐僧", "齐天大圣", "美猴王", "凯")
//    var maxLengthName = ""
//    var minLengthName = "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
//    for (item in list) {
//        if (item.length > maxLengthName.length) {
//            maxLengthName = item
//        }
//        if (item.length<minLengthName.length){
//            minLengthName = item
//        }
//    }
//
//    println("名称最长的那个名词是: " + maxLengthName)
//    println("名称最短的那个名词是: " + minLengthName)


//    // kotlin 函数式api实现
//    val list = listOf("孙悟空", "唐僧", "齐天大圣", "美猴王", "凯")
//    val maxLengthName = list.maxBy { it.length }
//    val minLengthName = list.minBy { it.length }
//    println("名称最长的那个名词是: " + maxLengthName)
//    println("名称最短的那个名词是: " + minLengthName)


    /**
     * list集合中的map函数
     */
//    // Lambda表达式简化写法的演变过程
//    val list = listOf("猴子", "猪八戒", "娜可露露", "李元芳", "凯")
//    // 1. 完整的表达式写法: {参数1: 参数类型, 参数2: 参数类型 -> 函数体}
//    val lambdaParams = { itemName: String -> itemName.length }
//    val maxLengthName1 = list.maxBy(lambdaParams)
//    // 2. 不需要专门定义一个lambda参数, 可以直接将lambda表达式传入函数中;
//    val maxLengthName2 = list.maxBy({ itemName: String -> itemName.length })
//    // 3. Kotlin规定, 当Lambda参数是函数的最后一个参数时, 可以将Lambda参数移到函数的括号外面;
//    val maxLengthName3 = list.maxBy() { itemName: String -> itemName.length }
//    // 4. 如果Lambda参数是函数唯一一个参数的话, 可以将函数的括号省略;
//    val maxLengthName4 = list.maxBy { itemName: String -> itemName.length }
//    // 5. 由于kotlin拥有出色的类型推导机制, Lambda表达式中的参数列表其实在大多数情况下可以省略参数类型;
//    val maxLengthName5 = list.maxBy { itemName -> itemName.length }
//    // 6. 当Lambda表达式的参数列表中只有一个参数的时候, 也可以不必声明参数名, 而是使用it关键字来代替;
//    val maxLengthName6 = list.maxBy { it -> it.length }


//    // list集合中常用map函数式api的使用
//    // map()函数用于将集合中的每个元素都映射成一个另外的值, 映射的规则在lambda表达式中指定, 最终生成一个新的集合;
//    val list = listOf("Apple", "Orange", "Pear")
//    val newList = list.map { it.toUpperCase() }// 将名称全部转成大写
//    for (item in newList) {
//        print(" " + item)// APPLE ORANGE PEAR
//    }

//    val list = listOf("Apple", "Orange", "Pear")
//    val newList = list.map { it.toLowerCase() }// 将名称全部转成小写
//    for (item in newList) {
//        print(" " + item)// apple orange pear
//    }


    /**
     * list集合中的filter函数
     * filter()函数用来过滤集合中的数据, 可以单独使用, 也可以配合map函数使用;
     */
//    // 单独使用
//    val list = listOf("猴子", "嫦娥", "常山赵子龙", "娜可露露", "凯", "李元芳")
//    val newList = list.filter { it.length >= 3 }
//    for (item in newList) {
//        print(" " + item)// 常山赵子龙 娜可露露 李元芳
//    }

    // 配合map函数使用
    val list = listOf("houzi", "change", "changshanzhaozilong", "nakelulu", "kai", "liyuanfang")
    val newList = list.filter { it.length >= 9 }.map { it.toUpperCase() }
    for (item in newList) {
        print(" " + item)// CHANGSHANZHAOZILONG LIYUANFANG
    }
}


